package handler

import (
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"swagger/api/request"
	"swagger/api/resp"
	"swagger/internal/dao"
	"swagger/internal/model"
)

// @Summary 注册
// @Description 注册
// @Tags user
// @Accept json
// @Produce json
// @Param data body request.RegisterReq true "注册参数"
// @Success 200 {object} resp.Response
// @Failure 400 {object} resp.Response
// @Router /user/register [post]
func Register(c *gin.Context) {
	//接收参数
	var req request.RegisterReq
	if err := c.ShouldBind(&req); err != nil {
		resp.Error(c, 400, "参数有误", err.Error())
		return
	}

	//业务逻辑
	var user model.User
	//1.判断用户是否存在
	dao.GetOneByFields(&model.User{
		Username: req.Username,
		Password: req.Password,
	}, &user)
	if user.ID == 0 {
		//2.注册
		dao.Create(&model.User{
			Username: req.Username,
			Password: req.Password,
			Email:    req.Email,
		})
	} else {
		//3.判断密码是否一致
		if user.Password != req.Password {
			resp.Error(c, 400, "账号密码错误", nil)
			return
		}
	}

	//返回参数
	resp.Success(c, "登录成功", user.ID)
}

// GetUserList 获取用户列表
// @Summary 获取用户列表
// @Description 获取所有用户信息
// @Tags 用户模块
// @Accept json
// @Produce json
// @Success 200 {object} resp.Response
// @Router /user/list [get]
func GetUserList(c *gin.Context) {
	//接收参数
	var req request.GetUserListReq
	if err := c.ShouldBind(&req); err != nil {
		resp.Error(c, 400, "参数有误", err.Error())
		return
	}

	//业务逻辑
	var users []model.User

	result := dao.GetListByFields(&model.User{}, &users)
	if !result {
		resp.Error(c, 400, "获取用户列表失败", nil)
		return
	}

	//返回参数
	resp.Success(c, "获取用户列表成功", users)

}

// GetUserDetail 获取用户详情
// @Summary 获取用户详情
// @Description 根据 ID 获取用户信息
// @Tags 用户模块
// @Accept json
// @Produce json
// @Param id query int true "用户ID"
// @Success 200 {object} resp.Response
// @Router /user/detail [get]
func GetUserDetail(c *gin.Context) {
	//接收参数
	var req request.GetUserDetailReq
	if err := c.ShouldBind(&req); err != nil {
		resp.Error(c, 400, "参数有误", err.Error())
		return
	}

	//业务逻辑
	var user model.User
	result := dao.GetOneById(uint(req.Id), &user)
	if !result {
		resp.Error(c, 400, "获取用户详情失败", nil)
		return
	}

	//返回参数
	resp.Success(c, "获取用户详情成功", user)
}

// UpdateUser 更新用户信息
// @Summary 更新用户
// @Description 根据 ID 更新用户信息
// @Tags 用户模块
// @Accept json
// @Produce json
// @Param data body request.UpdateUserReq true "更新信息"
// @Success 200 {object} resp.Response
// @Router /user/update [put]
func UpdateUser(c *gin.Context) {
	//接收参数
	var req request.UpdateUserReq
	if err := c.ShouldBind(&req); err != nil {
		resp.Error(c, 400, "参数有误", err.Error())
		return
	}

	//业务逻辑
	result := dao.Update(&model.User{
		Model:    gorm.Model{ID: uint(req.Id)},
		Username: req.Username,
		Email:    req.Email,
	})
	if !result {
		resp.Error(c, 400, "更新用户失败", nil)
		return
	}

	//返回参数
	resp.Success(c, "更新用户成功", nil)
}

// DeleteUser 删除用户
// @Summary 删除用户
// @Description 根据 ID 删除用户
// @Tags 用户模块
// @Accept json
// @Produce json
// @Param data body request.DeleteUserReq true "用户ID"
// @Success 200 {object} resp.Response
// @Router /user/delete [delete]
func DeleteUser(c *gin.Context) {
	//接收参数
	var req request.DeleteUserReq
	if err := c.ShouldBind(&req); err != nil {
		resp.Error(c, 400, "参数有误", err.Error())
		return
	}

	//业务逻辑
	result := dao.Delete(&model.User{
		Model: gorm.Model{ID: uint(req.Id)},
	})
	if !result {
		resp.Error(c, 400, "删除用户失败", nil)
		return
	}

	//返回参数
	resp.Success(c, "删除用户成功", nil)

}
